package org.example.service;

import org.apache.commons.beanutils.PropertyUtils;
import org.example.entity.SysMenuByName;
import org.example.entity.SysMenuPAndC;
import org.example.mapper.MenuMapper;
import org.example.mapper.MenuPanCMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class MenuSelectService {
    @Resource
    private MenuMapper menuMapper;

    @Resource
  private   MenuPanCMapper menuPanCMapper;

    public List<SysMenuByName> sysMenuByNameList() {

        List<SysMenuPAndC> sysMenuList = menuPanCMapper.menuList();

        List<SysMenuByName> rootMenuByname = sysMenuList.stream()
                .filter(sm -> sm.getType() == 0)
                .map(this::convertSysMenuToModelModel).collect(Collectors.toList());

        System.out.println(rootMenuByname.toString());
        // 构建递归树， 据顶级菜单往下挂儿子菜单或者孙子菜单；
        generateRecursionRoutes(rootMenuByname, sysMenuList);

        return rootMenuByname;
    }

    private void generateRecursionRoutes(List<SysMenuByName> menuByNamess, List<SysMenuPAndC> sysMenuPAndCS) {
        // null == menuModels || menuModels.isEmpty()
        if (!CollectionUtils.isEmpty(menuByNamess)) {
            // 循环获取每个路由，然后挂儿子路由: 儿子的parentId == 等于它的id
            menuByNamess.forEach(m -> {
                // 获取当前路由的id, 根据id找儿子(儿子的parentId为当前路由的id)
                Integer id = m.getId();
                /**
                 * Integer的值 [-128, 127]
                 * 1.filter(sm -> !sm.getType().equals(2)) 排除掉所有的按钮，就是所有的菜单 因为数据库中按钮的 type 为2
                 * 2.filter(sm -> sm.getParentId().equals(id)) 找到所有的儿子菜单
                 * 2.map(this::convertSysMenuToModelModel) 将找到的儿子转换 MenuModel
                 */
                List<SysMenuByName> children = sysMenuPAndCS.stream()
                        .filter(sm -> sm.getParentId() != 0) // 筛选出所有的菜单
                        .filter(sm -> sm.getParentId().equals(id))  // 找到所有的子菜单
                        .map(this::convertSysMenuToModelModel).collect(Collectors.toList());

                /** */


                if (!CollectionUtils.isEmpty(children)) {
                    // 将儿子路由塞进去
                    m.setChildren(children);
                    // 接着构建儿子的后代路由
                    generateRecursionRoutes(children, sysMenuPAndCS);
                }
            });
        }
    }

    private SysMenuByName convertSysMenuToModelModel(SysMenuPAndC sysMenu) {
        /**
         * PropertyUtils.copyProperties(); 将源对象中属性拷贝到目标对象中, 接受两个参数：
         *   1.第一个参数是目标对象；
         *   2.第二个参数是源对象；
         *  能够拷贝的前提是他们拥有者相同的属性
         */

        SysMenuByName model = new SysMenuByName();
        try {

            PropertyUtils.copyProperties(model, sysMenu);
            /**
             * 有一个类菜单很特殊：
             * 1. 这个菜单只有一个权限（菜单下只有一个权限的情况，数据就直接权限挂载菜单上），并且这个菜单的操作权限
             *   直接设计到菜单上了。参看数据库: "系统日志"
             * 2. 该菜单的类型是1; 这个权限就是菜单的 perms 本身，
             */

        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    }



}
